package br.ufc.quixada.controller;

import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.persistence.PersistenceException;
import javax.servlet.http.HttpSession;

import br.ufc.quixada.exceptions.ErroLoginException;
import br.ufc.quixada.model.DAO.PapelJDAO;
import br.ufc.quixada.model.DAO.PerfilJDAO;
import br.ufc.quixada.model.DAO.UsuarioJDAO;
import br.ufc.quixada.model.entidades.Papel;
import br.ufc.quixada.model.entidades.Perfil;
import br.ufc.quixada.model.entidades.Usuario;
import br.ufc.quixada.model.interfaces.PapelDAO;
import br.ufc.quixada.model.interfaces.PerfilDAO;
import br.ufc.quixada.model.interfaces.UsuarioDAO;

@RequestScoped
@ManagedBean(name = "usuarioBean")
public class UsuarioBean {

	private Usuario usuario;
	private String novaSenha;
	
	public UsuarioBean() {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(false);
		Object user;
		if (session != null && (user = session.getAttribute("usuario")) != null
				&& (user instanceof Usuario)) {
			this.usuario = (Usuario) user;
		} else {
			this.usuario = new Usuario();
		}
	}

	public String cadastrarUsuario() {
		UsuarioDAO usuarioDao = new UsuarioJDAO();
		
		try {
			usuarioDao.begin();
			usuarioDao.save(this.usuario);
			
			usuarioDao.commit();
			
			adicionaPerfis();
			
			System.err.println("Cadastrando Usuário");
			
			System.out.println("Cadastrando perfis");
			
			
			
			
			
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Usuário Cadastrado com Sucesso",
							"Usuário Cadastrado"));
		} catch (PersistenceException ex) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro",
							"Aviso"));
			ex.printStackTrace();
		}finally{
			usuarioDao.close();
			
		}
		
		try {
			usuario = new Usuario();
			this.finalize();
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "";
	}
	
	private void adicionaPerfis() {
		PapelDAO papelDao = new PapelJDAO();
		PerfilDAO perfilDao = new PerfilJDAO();

		try {

			Perfil participante = new Perfil();
			Perfil administrador = new Perfil();
			Perfil organizador = new Perfil();

			Date data = new Date();

		

			Papel papelAdminstrador = papelDao.find(Papel.ADMINISTRADOR_EVENTO);
			Papel papelOrganizador = papelDao.find(Papel.ORGANIZADOR);
			Papel papelParticipante = papelDao.find(Papel.PARTICIPANTE);
			
			System.out.println("iniciando a transação dos perfis");
			perfilDao.begin();
		
			
			// Setando os atributos do perfil de adminstrador de enventos
			administrador.setPepel(papelAdminstrador);
			administrador.setUsuario(usuario);
			administrador.setDataCriacao(data);
			perfilDao.save(administrador);
			
			// Setando os atributos do perfil de organiador
			organizador.setPepel(papelOrganizador);
			organizador.setUsuario(usuario);
			organizador.setDataCriacao(data);
			perfilDao.save(organizador);
			
			// Setando os atritbutos do perfil de participante
			participante.setPepel(papelParticipante);
			participante.setUsuario(usuario);
			participante.setDataCriacao(data);
			perfilDao.save(participante);
			
			perfilDao.commit();
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			perfilDao.close();
		}
	}

	public String alterarDados() {
		UsuarioDAO dao = new UsuarioJDAO();	
		try {
			dao.begin();
			dao.update(this.usuario);
			dao.commit();
			System.out.println("Cidade: "+usuario.getCidade());
		} catch (PersistenceException ex) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN,
							"Erro ao tentar editar dados, tente novamente",
							"Erro"));
			ex.printStackTrace();
		}


		return "/usuario/home?faces-redirect=true";
	}
	
	public String alterarSenha() {

		UsuarioDAO dao = new UsuarioJDAO();
		
		try {
			dao.begin();
			dao.alterarSenha(usuario, novaSenha);
			dao.commit();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Senha alterada com sucesso!",
							"Sucesso"));
			
		} catch (PersistenceException ex) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Erro ao tentar editar senha, tente novamente!",
							"Erro"));
			ex.printStackTrace();
		} catch (ErroLoginException e) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Senha inválida, tente novamente", "Erro"));
			e.printStackTrace();
		}

		return "";
	}
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public String getNovaSenha() {
		return novaSenha;
	}

	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}

}
